package vis.core.common.mybatis;

import vis.core.common.properties.VisProSql;
import vis.core.common.util.DateKit;
import com.mybatisflex.core.FlexGlobalConfig;
import com.mybatisflex.core.audit.AuditManager;
import com.mybatisflex.core.keygen.KeyGeneratorFactory;
import com.mybatisflex.core.query.QueryColumnBehavior;
import com.mybatisflex.spring.boot.MyBatisFlexCustomizer;
import jakarta.annotation.Resource;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;

import java.util.Date;

@Configuration
@MapperScan({"vis.core.mapper"})
public class MyBatisFlexConfig implements MyBatisFlexCustomizer {
    @Resource
    private VisProSql visProSql;

    private static final Logger logger = LoggerFactory.getLogger("SQL");

    @Override
    public void customize(FlexGlobalConfig globalConfig) {
        //ID生成器
        KeyGeneratorFactory.register("SnowflakeKey", new KeyGenSnowflake());

        // 使用内置规则自动忽略 null 和 空字符串
        QueryColumnBehavior.setIgnoreFunction(QueryColumnBehavior.IGNORE_EMPTY);

        // 使用内置规则自动忽略 null 和 空白字符串
        QueryColumnBehavior.setIgnoreFunction(QueryColumnBehavior.IGNORE_BLANK);

        //如果传入的值是集合或数组，则使用 in 逻辑，否则使用 =（等于） 逻辑：
        QueryColumnBehavior.setSmartConvertInToEquals(true);

        //全局逻辑删除字段 del
        globalConfig.setLogicDeleteColumn("del");

        //脱敏规则
        //        MaskManager.registerMaskProcessor("removePassword", data -> null);

        //设置SQL审计
        if (visProSql.getShow()) {
            AuditManager.setAuditEnable(true);
            AuditManager.setMessageCollector(auditMessage ->
                    logger.info("\n\033[31m{}  {}  {}ms  {}条\n{}\033[0m",
                            auditMessage.getHostIp(),
                            DateKit.dateToStr(new Date(auditMessage.getQueryTime()), "yyyy-MM-dd HH:mm:ss:sss"),
                            auditMessage.getQueryCount(),
                            auditMessage.getElapsedTime(),
                            auditMessage.getFullSql())
            );
        }

    }

}